library(tidyverse)
library(sf)
library(raster)
library(leaflet)
library(ggspatial)
library(rnaturalearth)
library(rnaturalearthdata)
library(maps)
library(osrm)
library(tidygeocoder)
data <- read_rds("../data/data_aggregated.rds")
head(data)
unique(data$PR_NAME)
[1] "Western Cape"  "Eastern Cape"  "Northern Cape" "Gauteng"      

#select and filter

data_geo <- data %>% 
  #filter(`PR_NAME` %in% c("Western Cape")) %>% 
  dplyr::select(`timestamp`, `vehicleid`, `event_description`, `coordinate_latitude`, `coordinate_longitude`) %>% 
  mutate(icon = 
           case_when(
            event_description == "Power On" ~ "car-on",
            event_description == "Idle Start" ~ "hand",
            event_description == "ROAM_Start" ~ "satellite-dish",
            event_description == "Speeding" ~ "gauge-high",
            event_description == "Speeding end" ~ "gauge",
            event_description == "GPS_Lock" ~ "location-crosshairs",
            event_description == "GPS_Lost" ~ "circle-xmark")) %>% 
  drop_na(icon)

data_geo_speeding <- data_geo %>% 
  filter(event_description %in% c("Speeding"))

data_geo_GPS <- data_geo %>% 
  filter(event_description %in% c("GPS_Lock","GPS_Lost"))

convert to spatial dataframe

data_spatial <- st_as_sf(
  data_geo,
  coords = c("coordinate_longitude","coordinate_latitude"),
  crs = 4326
)

data_geo_speeding <- st_as_sf(
  data_geo_speeding,
  coords = c("coordinate_longitude","coordinate_latitude"),
  crs = 4326
)

data_geo_GPS <- st_as_sf(
  data_geo_GPS,
  coords = c("coordinate_longitude","coordinate_latitude"),
  crs = 4326
)

from points to lines

# route code - slightly buggy
# data_spatial <- data_spatial %>%
#   group_by(vehicleid) %>%
#   arrange(timestamp) %>% 
#   summarise(do_union = F)
# 
# routes_spatial <- data_spatial %>% 
#   st_cast(to = "LINESTRING")
# 
# routes_spatial = routes_spatial %>% 
#   mutate(distance = st_length(.))

initial plotting

world <- ne_countries(country = "South Africa", returnclass = "sf") %>%    st_set_crs(4326)

colnames(data_geo_events)
Error in is.data.frame(x) : object 'data_geo_events' not found

GPS Speeding Log

# GPS Lost/Lock

ignition on

# idling


data_geo_Idle %>% 
  leaflet() %>%
  setView(lng = 25, lat = -30, zoom = 5) %>% 
  addProviderTiles("Esri.WorldGrayCanvas", options = tileOptions(minZoom=5, maxZoom=16))%>%  
  addAwesomeMarkers(lng = st_coordinates(data_geo_Idle$geometry)[, "X"], 
                    lat = st_coordinates(data_geo_Idle$geometry)[, "Y"],
                    label = ~vehicleid,
                    clusterOptions = markerClusterOptions()) 
LS0tDQp0aXRsZTogIkdlb2dyYXBoaWNhbCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCg0KYGBge3IgU2V0dXB9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KHJhc3RlcikNCmxpYnJhcnkobGVhZmxldCkNCmxpYnJhcnkoZ2dzcGF0aWFsKQ0KbGlicmFyeShybmF0dXJhbGVhcnRoKQ0KbGlicmFyeShybmF0dXJhbGVhcnRoZGF0YSkNCmxpYnJhcnkobWFwcykNCmxpYnJhcnkob3NybSkNCmxpYnJhcnkodGlkeWdlb2NvZGVyKQ0KYGBgDQoNCmBgYHtyfQ0KZGF0YSA8LSByZWFkX3JkcygiLi4vZGF0YS9kYXRhX2FnZ3JlZ2F0ZWQucmRzIikNCmhlYWQoZGF0YSkNCnVuaXF1ZShkYXRhJFBSX05BTUUpDQpgYGANCg0KI3NlbGVjdCBhbmQgZmlsdGVyDQpgYGB7cn0NCmRhdGFfZ2VvIDwtIGRhdGEgJT4lIA0KICAjZmlsdGVyKGBQUl9OQU1FYCAlaW4lIGMoIldlc3Rlcm4gQ2FwZSIpKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoYHRpbWVzdGFtcGAsIGB2ZWhpY2xlaWRgLCBgZXZlbnRfZGVzY3JpcHRpb25gLCBgY29vcmRpbmF0ZV9sYXRpdHVkZWAsIGBjb29yZGluYXRlX2xvbmdpdHVkZWApICU+JSANCiAgbXV0YXRlKGljb24gPSANCiAgICAgICAgICAgY2FzZV93aGVuKA0KICAgICAgICAgICAgZXZlbnRfZGVzY3JpcHRpb24gPT0gIlBvd2VyIE9uIiB+ICJjYXItb24iLA0KICAgICAgICAgICAgZXZlbnRfZGVzY3JpcHRpb24gPT0gIklkbGUgU3RhcnQiIH4gImhhbmQiLA0KICAgICAgICAgICAgZXZlbnRfZGVzY3JpcHRpb24gPT0gIlJPQU1fU3RhcnQiIH4gInNhdGVsbGl0ZS1kaXNoIiwNCiAgICAgICAgICAgIGV2ZW50X2Rlc2NyaXB0aW9uID09ICJTcGVlZGluZyIgfiAiZ2F1Z2UtaGlnaCIsDQogICAgICAgICAgICBldmVudF9kZXNjcmlwdGlvbiA9PSAiU3BlZWRpbmcgZW5kIiB+ICJnYXVnZSIsDQogICAgICAgICAgICBldmVudF9kZXNjcmlwdGlvbiA9PSAiR1BTX0xvY2siIH4gImxvY2F0aW9uLWNyb3NzaGFpcnMiLA0KICAgICAgICAgICAgZXZlbnRfZGVzY3JpcHRpb24gPT0gIkdQU19Mb3N0IiB+ICJjaXJjbGUteG1hcmsiLA0KICAgICAgICAgICAgZXZlbnRfZGVzY3JpcHRpb24gPT0gIklnbiBPTiIgfiAiZXhjbGFtYXRpb24iKSkgJT4lIA0KICBkcm9wX25hKGljb24pDQoNCmRhdGFfZ2VvX3NwZWVkaW5nIDwtIGRhdGFfZ2VvICU+JSANCiAgZmlsdGVyKGV2ZW50X2Rlc2NyaXB0aW9uICVpbiUgYygiU3BlZWRpbmciKSkNCg0KZGF0YV9nZW9fR1BTIDwtIGRhdGFfZ2VvICU+JSANCiAgZmlsdGVyKGV2ZW50X2Rlc2NyaXB0aW9uICVpbiUgYygiR1BTX0xvY2siLCJHUFNfTG9zdCIpKQ0KDQpkYXRhX2dlb19JZ24gPC0gZGF0YV9nZW8gJT4lIA0KICBmaWx0ZXIoZXZlbnRfZGVzY3JpcHRpb24gJWluJSBjKCJJZ24gT04iKSkNCg0KZGF0YV9nZW9fSWRsZSA8LSBkYXRhX2dlbyAlPiUgDQogIGZpbHRlcihldmVudF9kZXNjcmlwdGlvbiAlaW4lIGMoIklkbGUgU3RhcnQiKSkNCmBgYA0KDQojIGNvbnZlcnQgdG8gc3BhdGlhbCBkYXRhZnJhbWUNCmBgYHtyfQ0KZGF0YV9zcGF0aWFsIDwtIHN0X2FzX3NmKA0KICBkYXRhX2dlbywNCiAgY29vcmRzID0gYygiY29vcmRpbmF0ZV9sb25naXR1ZGUiLCJjb29yZGluYXRlX2xhdGl0dWRlIiksDQogIGNycyA9IDQzMjYNCikNCg0KZGF0YV9nZW9fc3BlZWRpbmcgPC0gc3RfYXNfc2YoDQogIGRhdGFfZ2VvX3NwZWVkaW5nLA0KICBjb29yZHMgPSBjKCJjb29yZGluYXRlX2xvbmdpdHVkZSIsImNvb3JkaW5hdGVfbGF0aXR1ZGUiKSwNCiAgY3JzID0gNDMyNg0KKQ0KDQpkYXRhX2dlb19HUFMgPC0gc3RfYXNfc2YoDQogIGRhdGFfZ2VvX0dQUywNCiAgY29vcmRzID0gYygiY29vcmRpbmF0ZV9sb25naXR1ZGUiLCJjb29yZGluYXRlX2xhdGl0dWRlIiksDQogIGNycyA9IDQzMjYNCikNCg0KZGF0YV9nZW9fSWduIDwtIHN0X2FzX3NmKA0KICBkYXRhX2dlb19HUFMsDQogIGNvb3JkcyA9IGMoImNvb3JkaW5hdGVfbG9uZ2l0dWRlIiwiY29vcmRpbmF0ZV9sYXRpdHVkZSIpLA0KICBjcnMgPSA0MzI2DQopDQoNCmRhdGFfZ2VvX0lkbGUgPC0gc3RfYXNfc2YoDQogIGRhdGFfZ2VvX0dQUywNCiAgY29vcmRzID0gYygiY29vcmRpbmF0ZV9sb25naXR1ZGUiLCJjb29yZGluYXRlX2xhdGl0dWRlIiksDQogIGNycyA9IDQzMjYNCikNCmBgYA0KDQojIGZyb20gcG9pbnRzIHRvIGxpbmVzDQpgYGB7cn0NCiMgcm91dGUgY29kZSAtIHNsaWdodGx5IGJ1Z2d5DQojIGRhdGFfc3BhdGlhbCA8LSBkYXRhX3NwYXRpYWwgJT4lDQojICAgZ3JvdXBfYnkodmVoaWNsZWlkKSAlPiUNCiMgICBhcnJhbmdlKHRpbWVzdGFtcCkgJT4lIA0KIyAgIHN1bW1hcmlzZShkb191bmlvbiA9IEYpDQojIA0KIyByb3V0ZXNfc3BhdGlhbCA8LSBkYXRhX3NwYXRpYWwgJT4lIA0KIyAgIHN0X2Nhc3QodG8gPSAiTElORVNUUklORyIpDQojIA0KIyByb3V0ZXNfc3BhdGlhbCA9IHJvdXRlc19zcGF0aWFsICU+JSANCiMgICBtdXRhdGUoZGlzdGFuY2UgPSBzdF9sZW5ndGgoLikpDQpgYGANCg0KIyBpbml0aWFsIHBsb3R0aW5nDQpgYGB7ciBoZWlnaHQgPSAyMCwgd2lkdGggPSAyMH0NCiN3b3JsZCA8LSBuZV9jb3VudHJpZXMoY291bnRyeSA9ICJTb3V0aCBBZnJpY2EiLCByZXR1cm5jbGFzcyA9ICJzZiIpICU+JSAgICBzdF9zZXRfY3JzKDQzMjYpDQoNCg0KIyANCiMgZGF0YV9nZW9fZXZlbnRzICU+JSAgIA0KIyAgIGdncGxvdCgpKw0KIyAgIGdlb21fc2YoZGF0YSA9IHdvcmxkKSsNCiMgICBnZW9tX3NmKGFlcyhjb2xvcj1ldmVudF9kZXNjcmlwdGlvbiksc2l6ZSA9IDAuMDUpKw0KIyAgIGxhYnModGl0bGUgPSAiR1BTIEV2ZW50cyIpKw0KIyAgIHhsYWIoIkxvbmdpdHVkZSIpKw0KIyAgIHlsYWIoIkxhdHRpdHVkZSIpICsNCiMgICBnZ3NwYXRpYWw6OmFubm90YXRpb25fbm9ydGhfYXJyb3cobG9jYXRpb24gPSAiYnIiKSsNCiMgICBnZ3NwYXRpYWw6OmFubm90YXRpb25fc2NhbGUobG9jYXRpb24gPSAiYmwiKSANCiAgDQogIA0KYGBgDQoNCiMgR1BTIFNwZWVkaW5nIExvZw0KYGBge3J9DQojIGluaXRpYWwgYXR0ZW1wdA0KIyBnZ3Bsb3QoKSArDQojICAgZ2VvbV9zZihkYXRhPXdvcmxkLCBsd2Q9MC4yKSArDQojICAgZ2VvbV9zZihkYXRhPXJvdXRlc19zcGF0aWFsLCBjb2xvciA9dmVoaWNsZWlkKQ0KDQojIA0KIyAgZCA8LSB3b3JsZC5jaXRpZXMNCiMgIA0KIyAgZCA8LSBkW3doaWNoKGQkY291bnRyeS5ldGMgPT0gIlNvdXRoIEFmcmljYSIpLF0NCiMgIA0KIyAgZCA8LSBzdF9hc19zZihkLGNvb3JkcyA9IGMoImxvbmciLCJsYXQiKSkNCiMgIA0KIyAgc3RfY3JzKGQpIDwtIDQzMjYNCiMgIA0KDQpteV9pY29ucyA8LSBhd2Vzb21lSWNvbnMoaWNvbiA9IGRhdGFfZ2VvJGljb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgI21hcmtlckNvbG9yID0gZGF0YV9zcGF0aWFsJHZlaGljbGVpZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5ID0gImZhIikNCiANCnN0X2Nvb3JkaW5hdGVzKGRhdGFfZ2VvX2V2ZW50cyRnZW9tZXRyeSlbLCAiWCJdDQoNCmRhdGFfZ2VvX3NwZWVkaW5nICU+JSANCiAgbGVhZmxldCgpICU+JQ0KICBzZXRWaWV3KGxuZyA9IDI1LCBsYXQgPSAtMzAsIHpvb20gPSA1KSAlPiUgDQogIGFkZFByb3ZpZGVyVGlsZXMoIkVzcmkuV29ybGRHcmF5Q2FudmFzIiwgb3B0aW9ucyA9IHRpbGVPcHRpb25zKG1pblpvb209NSwgbWF4Wm9vbT0xNikpJT4lICANCiAgYWRkQXdlc29tZU1hcmtlcnMobG5nID0gc3RfY29vcmRpbmF0ZXMoZGF0YV9nZW9fc3BlZWRpbmckZ2VvbWV0cnkpWywgIlgiXSwgDQogICAgICAgICAgICAgICAgICAgIGxhdCA9IHN0X2Nvb3JkaW5hdGVzKGRhdGFfZ2VvX3NwZWVkaW5nJGdlb21ldHJ5KVssICJZIl0sDQogICAgICAgICAgICAgICAgICAgIGxhYmVsID0gfnZlaGljbGVpZCwNCiAgICAgICAgICAgICAgICAgICAgY2x1c3Rlck9wdGlvbnMgPSBtYXJrZXJDbHVzdGVyT3B0aW9ucygpKSANCg0KYGBgDQoNCiAjIEdQUyBMb3N0L0xvY2sNCmBgYHtyfQ0KZGF0YV9nZW9fR1BTICU+JSANCiAgbGVhZmxldCgpICU+JQ0KICBzZXRWaWV3KGxuZyA9IDI1LCBsYXQgPSAtMzAsIHpvb20gPSA1KSAlPiUgDQogIGFkZFByb3ZpZGVyVGlsZXMoIkVzcmkuV29ybGRHcmF5Q2FudmFzIiwgb3B0aW9ucyA9IHRpbGVPcHRpb25zKG1pblpvb209NSwgbWF4Wm9vbT0xNikpJT4lICANCiAgYWRkQXdlc29tZU1hcmtlcnMobG5nID0gc3RfY29vcmRpbmF0ZXMoZGF0YV9nZW9fR1BTJGdlb21ldHJ5KVssICJYIl0sIA0KICAgICAgICAgICAgICAgICAgICBsYXQgPSBzdF9jb29yZGluYXRlcyhkYXRhX2dlb19HUFMkZ2VvbWV0cnkpWywgIlkiXSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSB+ZXZlbnRfZGVzY3JpcHRpb24sDQogICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJPcHRpb25zID0gbWFya2VyQ2x1c3Rlck9wdGlvbnMoKSkgDQpgYGANCg0KIyBpZ25pdGlvbiBvbg0KYGBge3J9DQpkYXRhX2dlb19JZ24gJT4lIA0KICBsZWFmbGV0KCkgJT4lDQogIHNldFZpZXcobG5nID0gMjUsIGxhdCA9IC0zMCwgem9vbSA9IDUpICU+JSANCiAgYWRkUHJvdmlkZXJUaWxlcygiRXNyaS5Xb3JsZEdyYXlDYW52YXMiLCBvcHRpb25zID0gdGlsZU9wdGlvbnMobWluWm9vbT01LCBtYXhab29tPTE2KSklPiUgIA0KICBhZGRBd2Vzb21lTWFya2VycyhsbmcgPSBzdF9jb29yZGluYXRlcyhkYXRhX2dlb19JZ24kZ2VvbWV0cnkpWywgIlgiXSwgDQogICAgICAgICAgICAgICAgICAgIGxhdCA9IHN0X2Nvb3JkaW5hdGVzKGRhdGFfZ2VvX0lnbiRnZW9tZXRyeSlbLCAiWSJdLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IH52ZWhpY2xlaWQsDQogICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJPcHRpb25zID0gbWFya2VyQ2x1c3Rlck9wdGlvbnMoKSkgDQpgYGANCiANCiAjIGlkbGluZw0KYGBge3J9DQoNCmRhdGFfZ2VvX0lkbGUgJT4lIA0KICBsZWFmbGV0KCkgJT4lDQogIHNldFZpZXcobG5nID0gMjUsIGxhdCA9IC0zMCwgem9vbSA9IDUpICU+JSANCiAgYWRkUHJvdmlkZXJUaWxlcygiRXNyaS5Xb3JsZEdyYXlDYW52YXMiLCBvcHRpb25zID0gdGlsZU9wdGlvbnMobWluWm9vbT01LCBtYXhab29tPTE2KSklPiUgIA0KICBhZGRBd2Vzb21lTWFya2VycyhsbmcgPSBzdF9jb29yZGluYXRlcyhkYXRhX2dlb19JZGxlJGdlb21ldHJ5KVssICJYIl0sIA0KICAgICAgICAgICAgICAgICAgICBsYXQgPSBzdF9jb29yZGluYXRlcyhkYXRhX2dlb19JZGxlJGdlb21ldHJ5KVssICJZIl0sDQogICAgICAgICAgICAgICAgICAgIGxhYmVsID0gfnZlaGljbGVpZCwNCiAgICAgICAgICAgICAgICAgICAgY2x1c3Rlck9wdGlvbnMgPSBtYXJrZXJDbHVzdGVyT3B0aW9ucygpKSANCmBgYA0KIA0KIA==